/**
 * 文本视图组件
 * 
 * 职责：
 * 1. 缓存 Label 相关组件
 * 2. 提供 Label 渲染的便捷方法
 * 
 * 适用场景：
 * - 纯文本 UI（按钮文字、标签、提示）
 * - 不需要图片的文本对象
 * 
 * 内存占用：~56 bytes
 * - 基类: ~40 bytes
 * - _label: 8 bytes
 * - _uiTransform: 8 bytes
 * 
 * @author AI Assistant
 * @date 2025-11-29
 */

import { ecs } from "../../../../core/ecs/ECS";
import { Label, UITransform, Color } from "cc";
import { ViewComponentBase } from "./ViewComponentBase";

/**
 * 文本视图组件（只缓存 Label）
 */
@ecs.register('ViewLabel', false)
export class ViewComponentLabel extends ViewComponentBase {
    // ========== 懒加载缓存 ==========
    
    /** Label 组件（文本渲染）- 懒加载 */
    private _label: Label | null | undefined = undefined;
    
    /** UITransform 组件（UI 变换）- 懒加载 */
    private _uiTransform: UITransform | null | undefined = undefined;
    
    // ========== 懒加载 Getter ==========
    
    /**
     * 获取 Label 组件（懒加载）
     */
    get label(): Label | null {
        if (this._label === undefined) {
            this._label = this.node?.getComponent(Label) || null;
        }
        return this._label;
    }
    
    /**
     * 获取 UITransform 组件（懒加载）
     */
    get uiTransform(): UITransform | null {
        if (this._uiTransform === undefined) {
            this._uiTransform = this.node?.getComponent(UITransform) || null;
        }
        return this._uiTransform;
    }
    
    /**
     * 重置组件
     */
    reset(): void {
        super.reset();
        this._label = undefined;
        this._uiTransform = undefined;
    }
    
    // ========== 便捷方法 ==========
    
    /**
     * 设置文本内容
     */
    setText(text: string): void {
        if (this.label) {
            this.label.string = text;
        }
    }
    
    /**
     * 设置文本颜色
     */
    setColor(color: Color): void {
        if (this.label) {
            this.label.color = color;
        }
    }
    
    /**
     * 设置字体大小
     */
    setFontSize(size: number): void {
        if (this.label) {
            this.label.fontSize = size;
        }
    }
    
    /**
     * 获取文本内容
     */
    getText(): string {
        return this.label ? this.label.string : '';
    }
    
    /**
     * 追加文本
     */
    appendText(text: string): void {
        if (this.label) {
            this.label.string += text;
        }
    }
    
    /**
     * 清空文本
     */
    clearText(): void {
        if (this.label) {
            this.label.string = '';
        }
    }
    
    /**
     * 设置文本对齐方式
     */
    setAlignment(horizontal: number, vertical: number): void {
        if (this.label) {
            // horizontal: 0=左, 1=中, 2=右
            // vertical: 0=上, 1=中, 2=下
            this.label.horizontalAlign = horizontal;
            this.label.verticalAlign = vertical;
        }
    }
    
    /**
     * 文字打字机效果
     */
    typewriterEffect(
        text: string, 
        duration: number, 
        callback?: () => void
    ): void {
        if (!this.label) return;
        
        this.label.string = '';
        const chars = text.split('');
        const intervalTime = (duration * 1000) / chars.length;
        let index = 0;
        
        const interval = setInterval(() => {
            if (index < chars.length) {
                this.label!.string += chars[index];
                index++;
            } else {
                clearInterval(interval);
                if (callback) callback();
            }
        }, intervalTime);
    }
}

